<!DOCTYPE html>
<html><head>
<title>Game Making - Flappy Bird</title>




<meta charset="utf-8">
<meta name="X-UA-Compatible" content="IE=edge">
<meta name="google-site-verification" content="">
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport">
<meta content="telephone=no" name="format-detection">
<meta name="description" content="">
<meta name="renderer" content="webkit">
<meta name="theme-color" content="#ffffff">



<meta property="og:title" content="Game Making - Flappy Bird" />
<meta property="og:description" content="笨比飞扬鸟 笨比飞扬鸟简单地模仿了经典游戏Flappy Bird 游戏链接: https://www.construct.net/en/free-online-games/free-game-17945/play (手机端和PC端都可以玩)
视频链接: https://www.bilibili.com/video/BV1S54y1y7P7/
 设计思路   游戏规则
玩家需要通过点击鼠标/屏幕来使小鸟跳起来来避免迎面而来的绿柱子，在玩家不进行操作的情况下，笨比小蓝鸟会因为重力而往下掉。当小鸟撞上绿柱子时，游戏结束。
  界面的设定
我们需要三个界面：游戏启动界面，游戏界面和游戏结束界面。通过游戏启动界面的start按钮，玩家可以进入游戏界面进行游戏，当小鸟撞上绿柱子时界面转入游戏结束界面，游戏结束界面显示玩家本轮游戏的分数，并且玩家可以通过restart按钮重新进入游戏启动界面。
  对象和对象行为
小鸟(bird)可以进行跳跃，否则坠落，具有平台(Platform)属性,需要考虑小鸟的下落速度(和加速度)，还有小鸟跳跃一次的高度。
柱子(上柱子up和下柱子down)需要系统以一定的速率生成，并且能够向左移动，并在出界后自动销毁。其中上下柱子需要同时生成，并具有一样的速率，之间留出的间隔需要合理（保证小鸟能过去）,还需要用到随机生成器来是系统每次生成的柱子高度不同。
计分器(全局变量count)需要在小鸟通过一对柱子后计分，并显示在游戏页面左上方。
其余对象还包括文本显示对象(text)和输入对象(touch),按钮(button)和背景(background),他们都是游戏不可缺的元素。
  事件表
将事件表的事件进行分组有利于我们更清晰地安排事件。
分组包括“界面的跳转”，“小鸟的碰撞”，“障碍物的生成和销毁”，“得分的判定”。(在制作过程中有体现)
   制作过程   收集素材
素材来自张羿九学长！
  基本过程
  先创建一个新的项目   创建了三个背景板和对应的事件表，分别处理不同界面的事件：(下图出现在construct3界面的右侧)   单击右键创建对象，也可以直接将图片拖入场景版中直接创建对象   给对象赋予行为(右键单击对象-添加-行为)，以小鸟为例，需要给他赋予平台，并在左栏中给小鸟的速度等赋值，可参考图片：   构建事件表，可参考下面几张图(有一点乱)：
游戏界面的事件表: 开始界面的事件表: 结束界面的事件表:   最后可以耍小聪明美化一下开始结束界面，点击顶部菜单旁边的三角形预览游戏试玩（记得保存项目）。   小经验
可以先看construct3里的游戏实例(https://editor.construct.net/ 里的demo)，体验一下，刚开始不用担心看不明白或者看不全游戏的对象，事件表等是如何安排的，先有个大致印象。到自己实现小游戏时，对一个功能或逻辑不清楚的时候想想之前看的游戏案例有没有实现，再去翻看找到答案！
     问题思考 “0基础”用户为什么能较好编程制作游戏？例如，使用 Events sheet 和 Script 选择的区别  相对于编程，图形化的游戏设计程序显然能降低设计游戏的门槛，使用construct3或迷你世界设计游戏，设计者无需掌握脚本语言的，底层的技术被封装好，设计者能专注于处理游戏的安排的设计，减少了设计者的工作量。给予我个人的体验，使用construct3做游戏的全过程包括学习案例，参考案例，设计游戏；若使用脚本语言则需要先学习并熟悉脚本语言，才能设计并编写游戏，耗时长成本高。 相比于脚本语言，显然显示成表的事件表具有更高的可读性，设计者无需掌握脚本语言的。  这些平台如何表达游戏世界的事物和行为？ 如同C&#43;&#43;的类，可以通过类的数据成员和成员函数来模拟现实世界的事物和这些事物的行为，而这些平台则是通过对象和对象的动作来模拟游戏世界，同时这些平台提供的对象更针对于游戏的设计，比如精灵和子弹等概念。" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://wondrouswisdomcard.gitee.io/posts/blog2/" />
<meta property="article:published_time" content="2020-09-27T00:00:00+00:00" />
<meta property="article:modified_time" content="2020-09-27T00:00:00+00:00" /><meta property="og:site_name" content="My Blog" />





<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Game Making - Flappy Bird"/>
<meta name="twitter:description" content="笨比飞扬鸟 笨比飞扬鸟简单地模仿了经典游戏Flappy Bird 游戏链接: https://www.construct.net/en/free-online-games/free-game-17945/play (手机端和PC端都可以玩)
视频链接: https://www.bilibili.com/video/BV1S54y1y7P7/
 设计思路   游戏规则
玩家需要通过点击鼠标/屏幕来使小鸟跳起来来避免迎面而来的绿柱子，在玩家不进行操作的情况下，笨比小蓝鸟会因为重力而往下掉。当小鸟撞上绿柱子时，游戏结束。
  界面的设定
我们需要三个界面：游戏启动界面，游戏界面和游戏结束界面。通过游戏启动界面的start按钮，玩家可以进入游戏界面进行游戏，当小鸟撞上绿柱子时界面转入游戏结束界面，游戏结束界面显示玩家本轮游戏的分数，并且玩家可以通过restart按钮重新进入游戏启动界面。
  对象和对象行为
小鸟(bird)可以进行跳跃，否则坠落，具有平台(Platform)属性,需要考虑小鸟的下落速度(和加速度)，还有小鸟跳跃一次的高度。
柱子(上柱子up和下柱子down)需要系统以一定的速率生成，并且能够向左移动，并在出界后自动销毁。其中上下柱子需要同时生成，并具有一样的速率，之间留出的间隔需要合理（保证小鸟能过去）,还需要用到随机生成器来是系统每次生成的柱子高度不同。
计分器(全局变量count)需要在小鸟通过一对柱子后计分，并显示在游戏页面左上方。
其余对象还包括文本显示对象(text)和输入对象(touch),按钮(button)和背景(background),他们都是游戏不可缺的元素。
  事件表
将事件表的事件进行分组有利于我们更清晰地安排事件。
分组包括“界面的跳转”，“小鸟的碰撞”，“障碍物的生成和销毁”，“得分的判定”。(在制作过程中有体现)
   制作过程   收集素材
素材来自张羿九学长！
  基本过程
  先创建一个新的项目   创建了三个背景板和对应的事件表，分别处理不同界面的事件：(下图出现在construct3界面的右侧)   单击右键创建对象，也可以直接将图片拖入场景版中直接创建对象   给对象赋予行为(右键单击对象-添加-行为)，以小鸟为例，需要给他赋予平台，并在左栏中给小鸟的速度等赋值，可参考图片：   构建事件表，可参考下面几张图(有一点乱)：
游戏界面的事件表: 开始界面的事件表: 结束界面的事件表:   最后可以耍小聪明美化一下开始结束界面，点击顶部菜单旁边的三角形预览游戏试玩（记得保存项目）。   小经验
可以先看construct3里的游戏实例(https://editor.construct.net/ 里的demo)，体验一下，刚开始不用担心看不明白或者看不全游戏的对象，事件表等是如何安排的，先有个大致印象。到自己实现小游戏时，对一个功能或逻辑不清楚的时候想想之前看的游戏案例有没有实现，再去翻看找到答案！
     问题思考 “0基础”用户为什么能较好编程制作游戏？例如，使用 Events sheet 和 Script 选择的区别  相对于编程，图形化的游戏设计程序显然能降低设计游戏的门槛，使用construct3或迷你世界设计游戏，设计者无需掌握脚本语言的，底层的技术被封装好，设计者能专注于处理游戏的安排的设计，减少了设计者的工作量。给予我个人的体验，使用construct3做游戏的全过程包括学习案例，参考案例，设计游戏；若使用脚本语言则需要先学习并熟悉脚本语言，才能设计并编写游戏，耗时长成本高。 相比于脚本语言，显然显示成表的事件表具有更高的可读性，设计者无需掌握脚本语言的。  这些平台如何表达游戏世界的事物和行为？ 如同C&#43;&#43;的类，可以通过类的数据成员和成员函数来模拟现实世界的事物和这些事物的行为，而这些平台则是通过对象和对象的动作来模拟游戏世界，同时这些平台提供的对象更针对于游戏的设计，比如精灵和子弹等概念。"/>







<script src="/vendor/js/jquery.min.js" ></script>
<script src="/vendor/js/popper.min.js" ></script>
<script src="/vendor/js/bootstrap.min.js" ></script>
<script src="/vendor/js/smooth-scroll.polyfills.min.js" ></script>
<link type="text/css" rel="stylesheet" href="/vendor/css/bootstrap.min.css">
<script src="/vendor/js/vue.min.js" ></script>






<link rel="stylesheet" href="https://wondrouswisdomcard.gitee.io/scss/journal.min.c116bc90d171283f099f173854157ec8f183f9073b93443b2c8ad82899ee9025.css" integrity="sha256-wRa8kNFxKD8Jnxc4VBV&#43;yPGD&#43;Qc7k0Q7LIrYKJnukCU=" media="screen">



<link rel="stylesheet" href="https://wondrouswisdomcard.gitee.io/scss/dark-mode.min.552aae4638a84aa57cf0b195750a49ea9131d3bb621d1ed3ebc9b14b18166536.css" integrity="sha256-VSquRjioSqV88LGVdQpJ6pEx07tiHR7T68mxSxgWZTY=" media="screen">


<script src="https://wondrouswisdomcard.gitee.io/js/loadCSS.js"></script>
<script>
  loadCSS("https://fonts.googleapis.com/css?family=Lora|Montserrat|Fira+Mono|Noto+Serif+SC|Material+Icons");
</script>




  
    <script src="https://wondrouswisdomcard.gitee.io/js/toc-collapse.js"></script>
  



<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.css">
<script src="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.min.js"></script>
<script src="/vendor/js/md5.min.js"></script>
<script>
  var gitalk = new Gitalk({
  clientID: 'your client id',
  clientSecret: 'your client secret',
  repo: 'repo name',
  owner: 'user',
  admin: ['user'],
  id: md5(location.pathname),
  distractionFreeMode: 'false'
  });
  window.onload = function () {
        gitalk.render('gitalk-container')
  }
</script>







<script src="https://cdn.jsdelivr.net/npm/vue-disqus@3/dist/vue-disqus.js"></script>


</head>
<body>
    	<div id="app"><div ref="sideContainer" class="side-container">
    
    <a class="a-block nav-head false" href="https://wondrouswisdomcard.gitee.io">
    
        <div class="nav-title">
            Wondrous WindomCard&#39;s Blog
        </div>
        
        <div class="nav-subtitle">
            Themed by Diary.
        </div>
        
    </a>

    <div class="nav-link-list">
        
        
            
            
            
                
            
            
            
            <a class="a-block nav-link-item active" href="/posts">
                Archive
            </a>
            
        
            
            
            
            
            
            <a class="a-block nav-link-item false" href="/categories">
                Categories
            </a>
            
        
            
            
            
            
            
            <a class="a-block nav-link-item false" href="/tags">
                Tags
            </a>
            
        
            
            
            
            
            
            <a class="a-block nav-link-item false" href="/index.xml">
                RSS Feed
            </a>
            
        
    </div>

    

    <div class="nav-footer">
        
Hugo Theme <a href="https://github.com/amazingrise/hugo-theme-diary">Diary</a> by <a href="https://amazingrise.net">Rise</a>
<br>
Ported from <a href="https://mak1t0.cc/" target="_blank" rel="noreferrer noopener">Makito</a>'s <a href="https://github.com/SumiMakito/hexo-theme-journal/" target="_blank" rel="noreferrer noopener">Journal.</a> <br>
<br>

&copy;
	
	This is a customized copyright.
	

    </div>
    
</div><div ref="extraContainer" class="extra-container">
    
    
    <div class="toc animated-visibility" :class="{ invisible: scrollY <= 140 }">


	<div class="toc-content">
	
		
		
		
		<center>- CATALOG -</center>
		
		
		<ul>
			
				
				
					
						
						
						
						
						
							<li>
								<a href="#%e7%ac%a8%e6%af%94%e9%a3%9e%e6%89%ac%e9%b8%9f" onclick="onNavClick(`#笨比飞扬鸟-nav`)" id="笨比飞扬鸟-nav">
									笨比飞扬鸟
								</a>
							</li>
						
						
					
				
			
				
				
					
						
						
						
						
							
								<ul class="collapse" data-toggle="collapse">
							
								<ul class="collapse" data-toggle="collapse">
							
						
						
							<li>
								<a href="#%e7%ac%a8%e6%af%94%e9%a3%9e%e6%89%ac%e9%b8%9f%e7%ae%80%e5%8d%95%e5%9c%b0%e6%a8%a1%e4%bb%bf%e4%ba%86%e7%bb%8f%e5%85%b8%e6%b8%b8%e6%88%8fflappy-bird" onclick="onNavClick(`#笨比飞扬鸟简单地模仿了经典游戏flappy-bird-nav`)" id="笨比飞扬鸟简单地模仿了经典游戏flappy-bird-nav">
									笨比飞扬鸟简单地模仿了经典游戏Flappy Bird
								</a>
							</li>
						
						
					
				
			
				
				
					
						
						
						
							
								</ul>
							
						
						
						
							<li>
								<a href="#%e8%ae%be%e8%ae%a1%e6%80%9d%e8%b7%af" onclick="onNavClick(`#设计思路-nav`)" id="设计思路-nav">
									设计思路
								</a>
							</li>
						
						
					
				
			
				
				
					
						
						
						
						
						
							<li>
								<a href="#%e5%88%b6%e4%bd%9c%e8%bf%87%e7%a8%8b" onclick="onNavClick(`#制作过程-nav`)" id="制作过程-nav">
									制作过程
								</a>
							</li>
						
						
					
				
			
				
				
					
						
						
						
						
						
							<li>
								<a href="#%e9%97%ae%e9%a2%98%e6%80%9d%e8%80%83" onclick="onNavClick(`#问题思考-nav`)" id="问题思考-nav">
									问题思考
								</a>
							</li>
						
						
					
				
			
				
				
					
						
						
						
						
							
								<ul class="collapse" data-toggle="collapse">
							
						
						
							<li>
								<a href="#0%e5%9f%ba%e7%a1%80%e7%94%a8%e6%88%b7%e4%b8%ba%e4%bb%80%e4%b9%88%e8%83%bd%e8%be%83%e5%a5%bd%e7%bc%96%e7%a8%8b%e5%88%b6%e4%bd%9c%e6%b8%b8%e6%88%8f%e4%be%8b%e5%a6%82%e4%bd%bf%e7%94%a8-events-sheet-%e5%92%8c-script-%e9%80%89%e6%8b%a9%e7%9a%84%e5%8c%ba%e5%88%ab" onclick="onNavClick(`#0基础用户为什么能较好编程制作游戏例如使用-events-sheet-和-script-选择的区别-nav`)" id="0基础用户为什么能较好编程制作游戏例如使用-events-sheet-和-script-选择的区别-nav">
									“0基础”用户为什么能较好编程制作游戏？例如，使用 Events sheet 和 Script 选择的区别
								</a>
							</li>
						
						
					
				
			
				
				
					
						
						
						
						
						
							<li>
								<a href="#%e8%bf%99%e4%ba%9b%e5%b9%b3%e5%8f%b0%e5%a6%82%e4%bd%95%e8%a1%a8%e8%be%be%e6%b8%b8%e6%88%8f%e4%b8%96%e7%95%8c%e7%9a%84%e4%ba%8b%e7%89%a9%e5%92%8c%e8%a1%8c%e4%b8%ba" onclick="onNavClick(`#这些平台如何表达游戏世界的事物和行为-nav`)" id="这些平台如何表达游戏世界的事物和行为-nav">
									这些平台如何表达游戏世界的事物和行为？
								</a>
							</li>
						
						
					
				
			
		</ul>
	</div>

</div>
    
    <div class="pagination">
        <a id="globalBackToTop" class="pagination-action animated-visibility" href="#top" :class="{ invisible: scrollY == 0 }">
            <i class="material-icons pagination-action-icon">
                keyboard_arrow_up
            </i>
        </a>
        
        <a class="pagination-action" v-on:click="toggleDarkMode">
            <i class="material-icons pagination-action-icon" v-if="isDarkMode">
                brightness_4
            </i>
            <i class="material-icons pagination-action-icon" v-else="isDarkMode">
                brightness_7
            </i>
        </a>
        
        
    </div>
</div>
<div class="single-column-drawer-container" ref="drawer"
     v-bind:class="{ 'single-column-drawer-container-active': isDrawerOpen }">
    <div class="drawer-content">
        <div class="drawer-menu">
            
            
            
                
                
                
                    
                
                
                
                <a class="a-block drawer-menu-item active" href="/posts">
                    Archive
                </a>
                
            
                
                
                
                
                
                <a class="a-block drawer-menu-item false" href="/categories">
                    Categories
                </a>
                
            
                
                
                
                
                
                <a class="a-block drawer-menu-item false" href="/tags">
                    Tags
                </a>
                
            
                
                
                
                
                
                <a class="a-block drawer-menu-item false" href="/index.xml">
                    RSS Feed
                </a>
                
            
            
            <div class="toc">


	<div class="toc-content">
	
		
		
		
		<center>- CATALOG -</center>
		
		
		<ul>
			
				
				
					
						
						
						
						
						
							<li>
								<a href="#%e7%ac%a8%e6%af%94%e9%a3%9e%e6%89%ac%e9%b8%9f" onclick="onNavClick(`#笨比飞扬鸟-nav`)" id="笨比飞扬鸟-nav">
									笨比飞扬鸟
								</a>
							</li>
						
						
					
				
			
				
				
					
						
						
						
						
							
								<ul class="collapse" data-toggle="collapse">
							
								<ul class="collapse" data-toggle="collapse">
							
						
						
							<li>
								<a href="#%e7%ac%a8%e6%af%94%e9%a3%9e%e6%89%ac%e9%b8%9f%e7%ae%80%e5%8d%95%e5%9c%b0%e6%a8%a1%e4%bb%bf%e4%ba%86%e7%bb%8f%e5%85%b8%e6%b8%b8%e6%88%8fflappy-bird" onclick="onNavClick(`#笨比飞扬鸟简单地模仿了经典游戏flappy-bird-nav`)" id="笨比飞扬鸟简单地模仿了经典游戏flappy-bird-nav">
									笨比飞扬鸟简单地模仿了经典游戏Flappy Bird
								</a>
							</li>
						
						
					
				
			
				
				
					
						
						
						
							
								</ul>
							
						
						
						
							<li>
								<a href="#%e8%ae%be%e8%ae%a1%e6%80%9d%e8%b7%af" onclick="onNavClick(`#设计思路-nav`)" id="设计思路-nav">
									设计思路
								</a>
							</li>
						
						
					
				
			
				
				
					
						
						
						
						
						
							<li>
								<a href="#%e5%88%b6%e4%bd%9c%e8%bf%87%e7%a8%8b" onclick="onNavClick(`#制作过程-nav`)" id="制作过程-nav">
									制作过程
								</a>
							</li>
						
						
					
				
			
				
				
					
						
						
						
						
						
							<li>
								<a href="#%e9%97%ae%e9%a2%98%e6%80%9d%e8%80%83" onclick="onNavClick(`#问题思考-nav`)" id="问题思考-nav">
									问题思考
								</a>
							</li>
						
						
					
				
			
				
				
					
						
						
						
						
							
								<ul class="collapse" data-toggle="collapse">
							
						
						
							<li>
								<a href="#0%e5%9f%ba%e7%a1%80%e7%94%a8%e6%88%b7%e4%b8%ba%e4%bb%80%e4%b9%88%e8%83%bd%e8%be%83%e5%a5%bd%e7%bc%96%e7%a8%8b%e5%88%b6%e4%bd%9c%e6%b8%b8%e6%88%8f%e4%be%8b%e5%a6%82%e4%bd%bf%e7%94%a8-events-sheet-%e5%92%8c-script-%e9%80%89%e6%8b%a9%e7%9a%84%e5%8c%ba%e5%88%ab" onclick="onNavClick(`#0基础用户为什么能较好编程制作游戏例如使用-events-sheet-和-script-选择的区别-nav`)" id="0基础用户为什么能较好编程制作游戏例如使用-events-sheet-和-script-选择的区别-nav">
									“0基础”用户为什么能较好编程制作游戏？例如，使用 Events sheet 和 Script 选择的区别
								</a>
							</li>
						
						
					
				
			
				
				
					
						
						
						
						
						
							<li>
								<a href="#%e8%bf%99%e4%ba%9b%e5%b9%b3%e5%8f%b0%e5%a6%82%e4%bd%95%e8%a1%a8%e8%be%be%e6%b8%b8%e6%88%8f%e4%b8%96%e7%95%8c%e7%9a%84%e4%ba%8b%e7%89%a9%e5%92%8c%e8%a1%8c%e4%b8%ba" onclick="onNavClick(`#这些平台如何表达游戏世界的事物和行为-nav`)" id="这些平台如何表达游戏世界的事物和行为-nav">
									这些平台如何表达游戏世界的事物和行为？
								</a>
							</li>
						
						
					
				
			
		</ul>
	</div>

</div>
            
        </div>
    </div>
</div>
<transition name="fade">
    <div v-bind:class="{ 'single-column-drawer-mask': mounted }" v-if="isDrawerOpen" v-on:click="toggleDrawer"></div>
</transition>
<nav ref="navBar" class="navbar sticky-top navbar-light single-column-nav-container">
    <div ref="navBackground" class="nav-background"></div>
    <div class="container container-narrow nav-content">
        <button id="nav_dropdown_btn" class="nav-dropdown-toggle" type="button" v-on:click="toggleDrawer">
            <i class="material-icons">
                menu
            </i>
        </button>
        <a ref="navTitle" class="navbar-brand" href="https://wondrouswisdomcard.gitee.io">
            Wondrous WindomCard&#39;s Blog
        </a>
        
        <button type="button" class="nav-darkmode-toggle" v-on:click="toggleDarkMode">
            <i class="material-icons" v-if="isDarkMode">
                brightness_4
            </i>
            <i class="material-icons" v-else="isDarkMode">
                brightness_7
            </i>
        </button>
        
    </div>
</nav>
<div class="single-column-header-container" ref="pageHead"
     v-bind:style="{ transform: 'translateZ(0px) translateY('+.3*scrollY+'px)', opacity: 1-navOpacity }">
    <a href="https://wondrouswisdomcard.gitee.io">
        <div class="single-column-header-title">Wondrous WindomCard&#39;s Blog</div>
        
        <div class="single-column-header-subtitle">Themed by Diary.</div>
        

    </a>
</div>

            <div id="content">
<div ref="streamContainer" class="stream-container">
    <div class="post-list-container post-list-container-shadow">
        <div class="post">
            
            
            

            <div class="post-head-wrapper-text-only"
                
            >
                <div class="post-title">
                    Game Making - Flappy Bird
                    
                    <div class="post-meta">
                        
                        <time itemprop="datePublished">
                            2020-09-27 00:00
                        </time>
                        

                        
                            <i class="material-icons" style="">folder</i>
                                <a href="/categories/">[Experience &amp; Practice]</a>
                                &nbsp;
                        

                        
                            <i class="material-icons" style="">label</i>
                            
                                <a href="/tags/construct3">Construct3</a>
                                &nbsp;
                            
                        
                        
                    </div>
                </div>
            </div>
            
            <div class="post-body-wrapper">
                
                <div class="post-body" v-pre>
                
                    <h1 id="笨比飞扬鸟">笨比飞扬鸟</h1>
<p><img src="../../images/blog2/1.jpg" alt="游戏界面"></p>
<h3 id="笨比飞扬鸟简单地模仿了经典游戏flappy-bird">笨比飞扬鸟简单地模仿了经典游戏<strong>Flappy Bird</strong></h3>
<p><strong>游戏链接:</strong> <a href="https://www.construct.net/en/free-online-games/free-game-17945/play">https://www.construct.net/en/free-online-games/free-game-17945/play</a> (手机端和PC端都可以玩)</p>
<p><strong>视频链接:</strong> <a href="https://www.bilibili.com/video/BV1S54y1y7P7/">https://www.bilibili.com/video/BV1S54y1y7P7/</a></p>
<hr>
<h2 id="设计思路">设计思路</h2>
<ol>
<li>
<p><strong>游戏规则</strong></p>
<p>玩家需要通过点击鼠标/屏幕来使小鸟跳起来来避免迎面而来的绿柱子，在玩家不进行操作的情况下，笨比小蓝鸟会因为重力而往下掉。当小鸟撞上绿柱子时，游戏结束。</p>
</li>
<li>
<p><strong>界面的设定</strong></p>
<p>我们需要三个界面：游戏启动界面，游戏界面和游戏结束界面。通过游戏启动界面的<strong>start</strong>按钮，玩家可以进入游戏界面进行游戏，当小鸟撞上绿柱子时界面转入游戏结束界面，游戏结束界面显示玩家本轮游戏的分数，并且玩家可以通过<strong>restart</strong>按钮重新进入游戏启动界面。</p>
</li>
<li>
<p><strong>对象和对象行为</strong></p>
<p>小鸟(<strong>bird</strong>)可以进行跳跃，否则坠落，具有平台(Platform)属性,需要考虑小鸟的下落速度(和加速度)，还有小鸟跳跃一次的高度。</p>
<p>柱子(上柱子<strong>up</strong>和下柱子<strong>down</strong>)需要系统以一定的速率生成，并且能够向左移动，并在出界后自动销毁。其中上下柱子需要同时生成，并具有一样的速率，之间留出的间隔需要合理（保证小鸟能过去）,还需要用到随机生成器来是系统每次生成的柱子高度不同。</p>
<p>计分器(全局变量<strong>count</strong>)需要在小鸟通过一对柱子后计分，并显示在游戏页面左上方。</p>
<p>其余对象还包括文本显示对象(<strong>text</strong>)和输入对象(<strong>touch</strong>),按钮(<strong>button</strong>)和背景(<strong>background</strong>),他们都是游戏不可缺的元素。</p>
</li>
<li>
<p><strong>事件表</strong></p>
<p><em>将事件表的事件进行分组有利于我们更清晰地安排事件。</em></p>
<p>分组包括“界面的跳转”，“小鸟的碰撞”，“障碍物的生成和销毁”，“得分的判定”。(在<strong>制作过程</strong>中有体现)</p>
</li>
</ol>
<hr>
<h2 id="制作过程">制作过程</h2>
<ol>
<li>
<p>收集素材</p>
<p><img src="../../images/blog2/2.jpg" alt="游戏素材">
<strong>素材来自张羿九学长！</strong></p>
</li>
<li>
<p>基本过程</p>
<ol>
<li>
<p>先创建一个新的项目
<img src="../../images/blog2/0.png" alt="创建"></p>
</li>
<li>
<p>创建了三个背景板和对应的事件表，分别处理不同界面的事件：(下图出现在construct3界面的右侧)
<img src="../../images/blog2/3.png" alt="界面"></p>
</li>
<li>
<p>单击右键<strong>创建对象</strong>，也可以直接将图片拖入场景版中直接创建对象
<img src="../../images/blog2/4.png" alt="对象"></p>
</li>
<li>
<p><strong>给对象赋予行为</strong>(右键单击对象-添加-行为)，以小鸟为例，需要给他赋予<strong>平台</strong>，并在左栏中给小鸟的速度等赋值，可参考图片：
<img src="../../images/blog2/5.png" alt="行为"></p>
</li>
<li>
<p><strong>构建事件表</strong>，可参考下面几张图(有一点乱)：</p>
<p>游戏界面的事件表:
<img src="../../images/blog2/6.png" alt="事件表1">
<img src="../../images/blog2/7.png" alt="事件表2">
开始界面的事件表:
<img src="../../images/blog2/8.png" alt="事件表3">
结束界面的事件表:
<img src="../../images/blog2/9.png" alt="事件表4"></p>
</li>
<li>
<p>最后可以耍小聪明美化一下开始结束界面，点击顶部菜单旁边的三角形预览游戏试玩（记得保存项目）。 
<img src="../../images/blog2/10.png" alt="试玩"></p>
</li>
<li>
<p><strong>小经验</strong></p>
<p>可以先看construct3里的游戏实例(<a href="https://editor.construct.net/">https://editor.construct.net/</a> 里的<strong>demo</strong>)，体验一下，刚开始不用担心看不明白或者看不全游戏的对象，事件表等是如何安排的，先有个大致印象。到自己实现小游戏时，对一个功能或逻辑不清楚的时候想想之前看的游戏案例有没有实现，再去翻看找到答案！</p>
</li>
</ol>
</li>
</ol>
<hr>
<h2 id="问题思考">问题思考</h2>
<h3 id="0基础用户为什么能较好编程制作游戏例如使用-events-sheet-和-script-选择的区别">“0基础”用户为什么能较好编程制作游戏？例如，使用 Events sheet 和 Script 选择的区别</h3>
<ol>
<li>相对于编程，图形化的游戏设计程序显然能降低设计游戏的门槛，使用construct3或迷你世界设计游戏，设计者无需掌握脚本语言的，底层的技术被封装好，设计者能专注于处理游戏的安排的设计，减少了设计者的工作量。给予我个人的体验，使用construct3做游戏的全过程包括学习案例，参考案例，设计游戏；若使用脚本语言则需要先学习并熟悉脚本语言，才能设计并编写游戏，耗时长成本高。</li>
<li>相比于脚本语言，显然显示成表的事件表具有更高的可读性，设计者无需掌握脚本语言的。</li>
</ol>
<h3 id="这些平台如何表达游戏世界的事物和行为">这些平台如何表达游戏世界的事物和行为？</h3>
<p>如同C++的类，可以通过类的数据成员和成员函数来模拟现实世界的事物和这些事物的行为，而这些平台则是通过对象和对象的动作来模拟游戏世界，同时这些平台提供的对象更针对于游戏的设计，比如精灵和子弹等概念。</p>
<hr>

                    
                    <HR width="100%" id="EOF">
		    <p style="color:#777;">Last modified on 2020-09-27</p>
                    
                </div>
            </div>
            
            
            <nav class="post-pagination">

                
                <a class="newer-posts" href="https://wondrouswisdomcard.gitee.io/posts/homework5/">
			Next<br>Homework of Week 5
                </a>
                
                
                
                <a class="older-posts" href="https://wondrouswisdomcard.gitee.io/posts/java1/">
			Previous<br>Java - The Learning Experience 1
                </a>
                
            </nav>
            <div class="post-comment-wrapper">
                
<div class="comments">
    <vue-disqus shortname="Your disqus short name."></vue-disqus>
</div>
<noscript><noscript>Please activate JavaScript to view comments.</noscript></noscript>
<a href="https://disqus.com/" class="dsq-brlink">Comments powered by <span class="logo-disqus">Disqus</span></a>



<div id="gitalk-container"></div>






            </div>
        </div>
    </div>
</div>

            </div><div id="single-column-footer">
Hugo Theme <a href="https://github.com/amazingrise/hugo-theme-diary">Diary</a> by <a href="https://amazingrise.net">Rise</a>
<br>
Ported from <a href="https://mak1t0.cc/" target="_blank" rel="noreferrer noopener">Makito</a>'s <a href="https://github.com/SumiMakito/hexo-theme-journal/" target="_blank" rel="noreferrer noopener">Journal.</a> <br>
<br>

&copy;
	
	This is a customized copyright.
	
</div>
            </div>
    <script>
let app;

app = new Vue({
    el: '#app',
    data: {
        scrollY: 0,
        navOpacity: 0,
        isDrawerOpen: false,
        mounted: false,
        isDarkMode: false
    },
    methods: {
            sgn(t, x) {
                let k = 1. / (1. - 2 * t);
                if (x <= t) return 0;
                else if (x >= 1 - t) return 1;
                else {
                    return k * (x - t);
                }
            },
            handleScroll() {
                this.scrollY = window.scrollY;
                this.navOpacity = this.sgn(.0, Math.min(1, Math.max(0, window.scrollY / (this.pageHeadHeight() - this.navBarHeight() * 0.8))));
                const {navBar, navBackground, navTitle, extraContainer, streamContainer} = this.$refs;

                if (this.navOpacity >= 1) {
                    navBackground.style.opacity = 1;
                    navTitle.style.opacity = 1;
                } else {
                    navBackground.style.opacity = 0;
                    navTitle.style.opacity = 0;
                }
            },
            handleResize() {
                const {navBar, navBackground, navTitle, extraContainer, streamContainer} = this.$refs;
                extraContainer.style.left = (streamContainer.offsetWidth - extraContainer.offsetWidth) + 'px';
            },
            navBarHeight() {
                return this.$refs.navBar.offsetHeight;
            },
            pageHeadHeight() {
                return this.$refs.pageHead.offsetHeight;
            },
            toggleDrawer() {
                this.isDrawerOpen = !this.isDrawerOpen;
                document.getElementsByTagName('html')[0].style.overflow = this.isDrawerOpen ? 'hidden' : 'unset';
            },
            closeDrawer() {
                this.isDrawerOpen = false;
                document.getElementsByTagName('html')[0].style.overflow = this.isDrawerOpen ? 'hidden' : 'unset';
            },
            toggleDarkMode() {
                this.isDarkMode = !this.isDarkMode;
                if (this.isDarkMode==true){
                    document.cookie = "night=1;path=/";
                    document.body.classList.add("night");
                } else {
                    document.cookie = "night=0;path=/";
                    document.body.classList.remove("night");
                }
            }
    },
    created() {
        window.addEventListener('scroll', this.handleScroll);
        window.addEventListener('resize', this.handleResize);
        window._nonDesktop = function () {
            let check = false;
            (function (a) {
                if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true;
            })(navigator.userAgent || navigator.vendor || window.opera);
            return check;
        };
        
        var night = document.cookie.replace(/(?:(?:^|.*;\s*)night\s*\=\s*([^;]*).*$)|^.*$/, "$1");
        if (night==""){
            if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
                
            }
        }else{
            
            if (night=="1") {
                this.toggleDarkMode();
            }
        }
    },
    mounted() {
        this.handleScroll();
        this.handleResize();
        this.mounted = true;

        
    },
    destroyed() {
        window.removeEventListener('scroll', this.handleScroll);
        window.removeEventListener('resize', this.handleResize);
    }
});
</script>

<script src="https://wondrouswisdomcard.gitee.io/js/journal.js"></script>
    </body>
</html>
